package com.ig.presentacion.modelos.desembolso.calculos;

import java.util.GregorianCalendar;


import static com.ig.presentacion.modelos.desembolso.calculos.interfaces.ICalendarios.*;
import static com.ig.presentacion.modelos.desembolso.calculos.interfaces.IFrecuencias.ANUAL;
import static com.ig.presentacion.modelos.desembolso.calculos.interfaces.IFrecuencias.DIARIO;
import static com.ig.presentacion.modelos.desembolso.calculos.interfaces.IFrecuencias.MENSUAL;
import static com.ig.presentacion.modelos.desembolso.calculos.interfaces.IFrecuencias.SEMANAL;
import static com.ig.presentacion.modelos.desembolso.calculos.interfaces.IFrecuencias.SEMESTRAL;
import static com.ig.presentacion.modelos.desembolso.calculos.interfaces.IFrecuencias.TRIMESTRAL;
import java.util.Calendar;


public class Fechas {
    int frecuencia=MENSUAL;//la frecuencia en la que se debe incrementar las fechas
    int calendario=CALENDARIO_COMERCIAL;//el tipo de calendario
        
        private String dia;
	private String mes;
	private String anno;
	
	private Double DIA;
	private Double MES;
	private Integer ANNO;

        public void setFecha(String fecha){
                setAnno(fecha.substring(0,4));
                setMes(fecha.substring(4,6));
                setDia(fecha.substring(6,8));	
        }
	public void setCalendario(int calendario) {
		this.calendario= calendario;
	}
	
	public void setTipoFrecuencia(int frecuencia) {
		this.frecuencia = frecuencia;
	}
	
	public void setDia(String dia) {
		this.dia = dia;
	}
        
	public void setMes(String mes) {
		this.mes = mes;
	}
        
	public void setAnno(String anno) {
		this.anno = anno;
	}
        
	public Fechas() {		
		inicializarFecha();
	}	
        /**
         *
         *  La fecha inicial es el parametro
         *  formato AAAAMMDD
         *
         */
	public Fechas(Double fecha) {		
            inicializarFecha(fecha);
	}
        
        /**
         *Inicializa la fecha
         *@param fecha: fecha para inicializar
         */
        private void inicializarFecha(Double fecha){
            
        }
        
        /**
         *inicializa la fecha con la fecha de sistema
         */
        private void inicializarFecha(){                
                int diaa=Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
                int mess=Calendar.getInstance().get(Calendar.MONTH);
                anno=String.valueOf(Calendar.getInstance().get(Calendar.YEAR));
		
                if(diaa<9)dia=String.valueOf("0"+diaa);
		else dia=String.valueOf(diaa);
	
		if(mess<9)mes=String.valueOf("0"+mess);
		else mes=String.valueOf(mess);	
		
		//System.out.println(dia+mes+anno);
        }
    
    boolean NoUno=false;
    /**
     * Hace que al pedir las fechas no se generen fechas consecutivas, eso quiere decir que siempre devolvera la misma fecha
     */
    public void setNoUno(boolean NoUno) {
        this.NoUno = NoUno;
    }
    
    /*
     * ejemplo: "20050202"
     */
    public static Double getFechaActual(){
        String dia=null;
        String mes=null;
        String anno=String.valueOf(Calendar.getInstance().get(Calendar.YEAR));        

        int diaa=Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
        int mess=Calendar.getInstance().get(Calendar.MONTH);
        
	if(diaa<10)dia=String.valueOf("0"+diaa);
	else dia=String.valueOf(diaa);
	
	if(mess<10)mes=String.valueOf("0"+mess);
	else mes=String.valueOf(mess);			
        //System.out.println("->"+anno+mes+dia);
        return Double.parseDouble(anno+mes+dia);
    }
    
    /**
     *ejemplo: "20050202"
     *
     */
    public static String getFechaActualString(){
        String dia=null;
        String mes=null;
        String anno=String.valueOf(Calendar.getInstance().get(Calendar.YEAR));        

        int diaa=Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
        int mess=Calendar.getInstance().get(Calendar.MONTH);
        
	if(diaa<10)dia=String.valueOf("0"+diaa);
	else dia=String.valueOf(diaa);
	
	if(mess<10)mes=String.valueOf("0"+mess);
	else mes=String.valueOf(mess);			
        
        return anno+mes+dia;
    }    
    /**
     *Ejemplo "2005/02/02"
     *
     */     
    public  String getFormatoString(){
            String fecha="";
            String myFecha=String.valueOf(Math.round(getFecha()));
            //System.out.println("myFecha:"+myFecha);
            if(myFecha.length()==8){
                    fecha=myFecha.substring(0,4)+"/"+myFecha.substring(4,6)+"/"+myFecha.substring(6,8);                    
            }
            if(myFecha.length()==7){
                    fecha=myFecha.substring(0,1)+"/"+myFecha.substring(1,3)+"/"+myFecha.substring(3,7);                    
            }
            return fecha;
    }
    
    /**
     *Consecutivo de fechas, este consecutivo se pueden inicializar con los metodos
     *  this.inicializarFecha()             : se inicializa con la fecha de isitema, se llamar al invocar al constructos de esta clase.
        this.inicializarFecha(Double fecha) : inicialiar la fecha con una fecha especifica
     */
    public Double getFecha(){
		DIA=Double.parseDouble(dia);
		MES=Double.parseDouble(mes);
		ANNO=Integer.parseInt(anno);
		
    		String fecha=anno+mes+dia;  
    		if(NoUno)
                    return Double.parseDouble(fecha);
                
    		if(frecuencia==DIARIO){//diario
    			DIA=Double.parseDouble(dia);
    			DIA++;
    			if(DIA>getValorMaximoDias(MES)){
    				DIA=Double.parseDouble("1");
    				MES++;
    				if(MES>12){
    					MES=Double.parseDouble("1");
    					ANNO++;
    				}
    			}
    		}else if(frecuencia==SEMANAL){//semanal
    			DIA=Double.parseDouble(dia);
    			DIA+=7;
    			if(DIA>getValorMaximoDias(MES)){
    				DIA=DIA-30;
    				MES++;
    				if(MES>12){
    					MES=Double.parseDouble("1");
    					ANNO++;
    				}
    			}
    		}else if(frecuencia==MENSUAL){//mensual
    				MES++;
    				if(MES>12){
    					MES=Double.parseDouble("1");
    					ANNO++;
    				}    			    			
    		}else if(frecuencia==TRIMESTRAL){//trimestral
			MES+=3;
			if(MES>12){
				MES=MES-12;
				//MES=Double.parseDouble("1");
				ANNO++;
			}			
		}else if(frecuencia==SEMESTRAL){//semestral
			MES+=6;
			if(MES>12){
				MES=MES-12;
				//MES=Double.parseDouble("1");
				ANNO++;
			}		
		}else if(frecuencia==ANUAL){//anual
			ANNO++;			
		}
		if(DIA<10)dia=String.valueOf("0"+Math.round(DIA));
		else dia=String.valueOf(Math.round(DIA));
	
		if(MES<10)mes=String.valueOf("0"+Math.round(MES));
		else mes=String.valueOf(Math.round(MES));	
		
		anno=String.valueOf(Math.round(ANNO));
		
    		return Double.parseDouble(fecha);
    }
    /**
     * Retorna el numero maximo de dias que puede tener un año dependiendo de tipo calendario 
     * @Param: mes: al que se le quiere verificar el numero de dias
     *
     */
    private int getValorMaximoDias(double mes){
        if(calendario==CALENDARIO_365 || calendario==CALENDARIO_REAL){	
            if(mes==ENERO ||mes==MARZO ||mes==MAYO ||mes==AGOSTO||mes==JULIO ||mes==OCTUBRE ||mes==DICIEMBRE)    		
                    return 31;
            if(mes==SEPTIEMBRE ||mes==NOVIEMBRE ||mes==JUNIO ||mes==ABRIL)
                    return 30;
            if(mes==FEBRERO)
                if(calendario==CALENDARIO_REAL &&  new GregorianCalendar().isLeapYear(ANNO)){
                    return 29;//el a?o es visiesto
                }else{
                    return 28;//el a?o es no visiesto
                }
        }
        return calendario;//RETORNA 30, VALOR PARA CALENDARION COMERCIAL
    }
}